package com.ruoyi.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.gson.io.GsonSerializer;
import io.jsonwebtoken.impl.DefaultClaims;
import lombok.extern.slf4j.Slf4j;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
import java.util.Date;
import java.util.UUID;



/**
 * @Author: lsx
 * @Description: jwt工具类
 * @Create:  2025/1/7 9:41
 **/
@Slf4j
public class JJWTUtils {

    //单位为毫秒，默认过期时间为8小时
    private static final Integer expire = 8 * 60 * 60 * 1000;
    private static final String secret = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";

    // 传入一个用户id，创建token
    public static String createToken(Integer id) {
        long current = System.currentTimeMillis();
        Date now = new Date();
        Date expireDate = new Date(now.getTime() + expire);

        DefaultClaims claims = new DefaultClaims();
        claims.setId(UUID.randomUUID().toString());
        claims.setIssuer("aimi");
        claims.put("id",id.toString());
        claims.setIssuedAt(new Date(current + expire ));

        return Jwts.builder()
                .setClaims(claims)
                .signWith(generateKey())
                .serializeToJsonWith(new GsonSerializer<>())
                .setExpiration(expireDate)
                .compact();
    }


    private static SecretKey generateKey() {
        byte[] encodedKey = Base64.getDecoder().decode(secret);
        return new SecretKeySpec(encodedKey, 0, encodedKey.length, "HmacSHA256");
    }

    //这是一个使用JJWT解析token的方法，它接受一个token字符串和一个密钥字符串作为参数，
    // 返回一个Claims对象，如果token无效或过期，抛出异常
    public static Jws<Claims> parseJWT(String token){
        Jws<Claims> claims = null;

        try {
            claims =  Jwts.parserBuilder()
                    .setSigningKey(secret)
                    .build()
                    .parseClaimsJws(token);
        } catch (Exception ignored) {

        }
        return claims;
    }

    // 检测token是否有效，返回true表示有效（未过期）
    public static boolean verifyToken(String token) {
        try {
            // 解析token，如果成功则表示token有效，如果失败则表示token无效或过期
            Jws<Claims> claimsJws = Jwts.parserBuilder()
                    .setSigningKey(secret) // 设置密钥和算法
                    .build()
                    .parseClaimsJws(token); // 解析token字符串
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}